package ejbSessions;

import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.ejb.Stateless;
import javax.persistence.*;
import EJBPackage.*;

/**
 * Session Bean implementation class ManagerAmicizie
 */
@Stateless
public class ManagerAmicizie implements ManagerAmicizieRemote, ManagerAmicizieLocal {
	@PersistenceContext(unitName = "SWIMv2")
	EntityManager database;
	
    public ManagerAmicizie() {
    }

	public int richiediAmicizia(Utente richiedente, Utente destinatario){
		RichiestaAmicizia richiesta= new RichiestaAmicizia();
		richiesta.setStato(Costanti.STATO_PENDENTE);
		try{
			ManagerUtenteRemote managerUtenti = new ManagerUtente();
			
			if(esisteRichiesta(richiedente, destinatario) || sonoAmici(richiedente, destinatario)){
				return -1;
			}
			
			database.persist(richiesta);
			richiesta.setDestinatario(destinatario);
			richiesta.setMittente(richiedente);
			database.flush();
		}catch (Exception e) {
			e.printStackTrace();
		}
		return richiesta.getId();
	}

	public void accettaAmicizia(int idRichiesta){
		try {
			Query cercaRichiestaAmicizia = database.createQuery("FROM RichiestaAmicizia r WHERE r.id=:idRichiesta");
			cercaRichiestaAmicizia.setParameter("idRichiesta", idRichiesta);
			RichiestaAmicizia richiesta = (RichiestaAmicizia)cercaRichiestaAmicizia.getSingleResult();
			Utente u1,u2;
			u1 = richiesta.getDestinatario();
			u2 = richiesta.getMittente();
			u1.getAmici1().add(u2);
			database.flush();
			database.remove(richiesta);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void rifiutaAmicizia(int idRichiestaAmicizia){
		try {
    		Query qram = database.createQuery("FROM RichiestaAmicizia ram WHERE ram.id=:idRichiesta");
    		qram.setParameter("idRichiesta", idRichiestaAmicizia);
    		RichiestaAmicizia richiesta = (RichiestaAmicizia) qram.getSingleResult();
    		database.remove(richiesta);
 
		} catch (EntityNotFoundException exc) { 
    	} catch (javax.persistence.NoResultException exc) { 
    	} catch (NonUniqueResultException exc) {
    	}
	}


	@Override
	public boolean sonoAmici(Utente utente1, Utente utente2) {
		boolean amici = false;
		try{
			Set<Utente> listaAmici1 = utente1.getAmici1();
			Set<Utente> listaAmici2 = utente1.getAmici2();
			
			Iterator<Utente> i1 = listaAmici1.iterator();
			while(i1.hasNext() && !amici){
				Utente u = i1.next();
				if(u.getId()==utente2.getId()){
					amici=true;
				}
			}
			
			Iterator<Utente> i2 = listaAmici2.iterator();
			while(i2.hasNext() && !amici){
				Utente u = i2.next();
				if(u.getId()==utente2.getId()){
					amici=true;
				}
			}
			
		}catch (Exception e) {
			e.printStackTrace();
		}
		
		return amici;
	}

	@Override
	public boolean esisteRichiesta(Utente richiedente, Utente destinatario) {
		try{
			Query cercaRichiestaAmicizia = database.createQuery("FROM RichiestaAmicizia r WHERE ((r.mittente=:richiedente AND r.destinatario=:destinatario) OR (r.mittente=:destinatario AND r.destinatario=:richiedente)) AND r.stato=:statoPending");
			cercaRichiestaAmicizia.setParameter("richiedente", richiedente);
			cercaRichiestaAmicizia.setParameter("destinatario", destinatario);
			cercaRichiestaAmicizia.setParameter("statoPending", Costanti.STATO_PENDENTE);
			
			List<RichiestaAmicizia> risultatoRichiesta = cercaRichiestaAmicizia.getResultList();
			
			if(risultatoRichiesta.size()>0)
				return true;
		}catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

}
